﻿/*---------------------------------------------------------------------------------------
使用Ajax无刷新提交表单
使用些模块必需加域Ajax模块

使用方法: var ajaxForm=new AjaxForm(formObj,submited,error)
参数说明:
		formObj:表单对象。
		submited;提交成功后的处理函数,可省略
		error:失败后的处理函数，可省略
另有两个返回字段。
ajaxForm.responseText 提交成功后将返回从处理页面传递过来的字符串
ajaxForm.responseXML 提交成功后将返回从处理页面传递过来的XML
		
* 作者：舒彩光
* 创作时间：2007-1-4
* 完成时间：2007-1-4
* 第一次修改时间：无
* 修改目的及内容：无
*
*  本程式在IE、firfox中测试均通过。
*		如果存在BUG，或在功能上有不完善之处请用QQ联系；QQ：327285304


----------------------------------------------------------------------------------------*/
//构建Ajax提交的表单
//AjaxForm()
//AjaxForm(formObj)
//AjaxForm(formObj,submited)
function AjaxForm(formObj,submited,error){
	//输入参数
	this.formObj=formObj;
	this.submited=(submited)?submited:this.defaultSubmited;
	this.error=error;
	
	this._autoSubmit=true;
	this._submitDelegate=EventOperate.createDelegate(this,this._form__submit);
	EventOperate.addEvent(formObj,"submit",this._submitDelegate);
}

AjaxForm.prototype={
	set_action:function(value){
		this._action=value;
	},
	get_action:function(){
		if(!this._action) return this.formObj.action;
		return this._action;
	},
	add_submiting:function(handler){
		EventOperate.addHandler(this,"submiting",handler);
	},
	remove_submiting:function(){
		EventOperate.removeHandler(this,"submiting",handler);
	},
	set_autoSubmit:function(value){
		this._autoSubmit=value;
	},
	get_autoSubmit:function(){
		return this._autoSubmit;
	},
	//默认提交提示
	defaultSubmited:function(){
		alert("提交成功\n"+this.responseText);
	},
	//构建ajax提交过程
	//些过程需要AJAX模块，如页面中没加载AJAX则会产生错误
	submit:function(){
		var check=EventOperate.getHandler(this,"submiting");
		if(check && !check(this,null)) return;
		if(this.formObj.onsubmit && this.formObj.onsubmit()==false) return;

		var url=this.get_action();
		var data=this.getFormValue();
		var oThis=this;
		var tAjax=new Ajax(url,data,submited,this.error);
		function submited(){
			var e={};
			e.responseText=tAjax.responseText;
			e.responseXML=tAjax.responseXML;
			e.responseJSON=tAjax.responseJSON;
			oThis.submited(oThis,e);
		}
	},

	///////////////////////////////////////////////////////////////////////////////////////////
	//取得表单数据
	getFormValue:function(){
		var params=[];
		var elements=this.formObj.elements;
		var len=elements.length;
		for(var i=0;i<len;i++){
			var element=elements[i];
			var tagName=element.tagName.toUpperCase();
			var param=null;
			switch(tagName){
				case "INPUT":
				param=this._getValueByInput(element);
				break;
				case"SELECT":
				param=this._getValueBySelect(element);
				break;
				case "TEXTAREA":
				param=this._getValueByTextarea(element);
				break;
			}
			if(param!=null) params[params.length]=param;
		}
		return params.join("&");
	},
	_getValueByInput:function(obj){
		var type=obj.type.toUpperCase();
		if(type=="CHECKBOX" || type=="RADIO"){
			if(obj.checked==true){
				var name=obj.name;
				var value=escape(obj.value);
				var expression=name+"="+value;
				return expression;
			}else{
				return null;
			}
		}else{
			var name=obj.name;
			var value=escape(obj.value);
			var expression=name+"="+value;
			return expression;
		}
	},
	_getValueBySelect:function(obj){
		var name=obj.name;
		var expressions=[];
		for(var i=0;i<obj.options.length;i++){
			if(obj.options[i].selected){
				var value=obj.options[i].value;
				if(!value) value=obj.options[i].text;
				expressions[expressions.length]=name+"="+escape(value);
			}
		}
		if(expressions.length==0) expressions[0]=name+"=";
		return expressions.join("&");
	},
	_getValueByTextarea:function(obj){
		var name=obj.name;
		var value=escape(obj.value);
		var expression=name+"="+value;
		return expression;
	},
	_form__submit:function(sender,e){
		if(this.get_autoSubmit()) this.submit();	
	}
}

